package jp.sinmetal.trainer.form;

import java.util.Map;

import jp.sinmetal.trainer.util.PagingUtil;

import org.seasar.framework.beans.util.BeanMap;
import org.seasar.framework.beans.util.Beans;
import org.seasar.struts.annotation.LongType;

/**
 * ページング用のフィールドがあるフォームクラス
 * ページング機能を使う場合はこれを継承してください
 * @author sin
 *
 */
public abstract class PagingForm extends AbstractForm {

	/**
	 * 遷移先(indexメソッドの場合は指定無しで良い)
	 * @author sin
	 */
	public String href = "";

	/**
	 * ページング有無
	 * @author sin
	 */
	public Boolean paging = true;

	/**
	 * offset
	 * @author sin
	 */
	@LongType
	public String offsetNum = "0";

	/**
	 * limit
	 * @author sin
	 */
	@LongType
	public String limitNum = "10";

	/**
	 * 総レコード数
	 * @author sin
	 */
	@LongType
	public String totalRec = "0";

	/**
	 * クエリストリング名
	 *
	 * フォームのフィールド名を渡すと、クエリストリングとして、
	 * フィールド名=フィールドの値を生成する
	 * @author sin
	 */
	public String[] paramNames = null;

	/**
	 * デフォルトコンストラクタ
	 * @author sin
	 */
	public PagingForm() {}

	/**
	 * 遷移先を指定
	 * @author sin
	 *
	 * @param pagingAction
	 */
	public PagingForm(String href) {
		this.href = href;
	}

	/**
	 * パラメータを指定
	 * @author sin
	 *
	 * @param pagingAction
	 * @param limitNum
	 * @param paramNames
	 */
	public PagingForm(String ... paramNames) {
		this.paramNames = paramNames;
	}

	/**
	 * 遷移先,1頁に表示する件数を指定
	 * @author sin
	 *
	 * @param pagingAction
	 * @param limitNum
	 */
	public PagingForm(String href, Long limitNum) {
		this(href);
		this.limitNum = limitNum.toString();
	}

	/**
	 * 遷移先,1頁に表示する件数,パラメータを指定
	 * @author sin
	 *
	 * @param pagingAction
	 * @param limitNum
	 * @param paramNames
	 */
	public PagingForm(String href, Long limitNum, String ... paramNames) {
		this(href, limitNum);
		this.paramNames = paramNames;
	}

	/**
	 * ページング用Map取得
	 * @author sin
	 *
	 * @return
	 */
	public Map<Integer, String> getPagingMap() {
		BeanMap params = new BeanMap();
		if (paramNames != null) {
			Beans.copy(this, params).includes(paramNames).excludesNull().execute();
		}

		PagingUtil pagingUtil = new PagingUtil();
		return pagingUtil.makePagingLink(Long.valueOf(totalRec), Integer.valueOf(limitNum), params);
	}
}
